﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Principal;
using Xpus.Website.Data;
using Xpus.Website.Utilities;

namespace Xpus.Website.Core.Membership
{
	/// <summary>
	/// 表示Xpus用户的标识对象。
	/// </summary>
	public class XpusUserIdentity : IIdentity
	{
		/// <summary>
		/// 构造用户表示对象。
		/// </summary>
		/// <param name="user">用户对象数据实体。</param>
		internal XpusUserIdentity(User user)
		{
			this.User = user;
			this.Name = user.UserName;
		}

		/// <summary>
		/// 当前用户对象。
		/// </summary>
		public User User
		{
			get;
			private set;
		}

		#region IIdentity Members
		/// <summary>
		/// 获取所使用的身份验证的类型。
		/// </summary>
		public string AuthenticationType
		{
			get
			{
				return "Forms";
			}
		}

		/// <summary>
		/// 获取一个值，该值指示是否验证了用户。
		/// </summary>
		public bool IsAuthenticated
		{
			get
			{
				return true;
			}
		}

		/// <summary>
		/// 获取当前用户的名称。
		/// </summary>
		public string Name
		{
			get;
			private set;
		}
		#endregion
	}

	/// <summary>
	/// 表示Xpus中的用户对象。
	/// </summary>
	public class XpusUserPrincipal : IPrincipal
	{
		/// <summary>
		/// 构造用户对象。
		/// </summary>
		/// <param name="user">用户的数据实体。</param>
		internal XpusUserPrincipal(IPrincipal originalPrincipal)
		{
			this.OriginalPrincipal = originalPrincipal;
			this.User = null;

			if(originalPrincipal.Identity.Name.IsEmailAddress())
				this.User = User.GetBySecurityEmail(originalPrincipal.Identity.Name);
			else
				this.User = User.GetByUserName(originalPrincipal.Identity.Name);

			if(this.User == null)
				throw new UserNotExistsException(string.Format(LanguageUtility.GetString("User '{0}' is not exist."), originalPrincipal.Identity.Name));

			this.Identity = new XpusUserIdentity(this.User);
		}

		/// <summary>
		/// 当前用户对象。
		/// </summary>
		public User User
		{
			get;
			private set;
		}

		/// <summary>
		/// 获取原始的（由ASP.NET FromsAuthentication创建的）IPrincipal接口对象。
		/// </summary>
		public IPrincipal OriginalPrincipal
		{
			get;
			private set;
		}

		#region IPrincipal Members
		/// <summary>
		/// 获取当前用户的标识。 
		/// </summary>
		public IIdentity Identity
		{
			get;
			private set;
		}

		/// <summary>
		/// 确定当前用户是否属于指定的角色。
		/// </summary>
		/// <param name="role">要检查其成员资格的角色的名称。</param>
		/// <returns>如果当前用户是指定角色的成员，则为 true；否则为 false。</returns>
		/// <remarks>目前该方法尚未实现，总是返回false。</remarks>
		public bool IsInRole(string role)
		{
			return false;
		}
		#endregion
	}
}
